
/**
 * Content: ArrayList-初始化方式、遍历ArrayList、List转数组、数组转List、ArrayList常用方法、线程安全的Vector
 * --------------------------------------------------
 * 带你走进Java集合之ArrayList: https://juejin.cn/post/6844903683419799565
 * 遍历ArrayList的三种方法: https://blog.csdn.net/qq_52476654/article/details/119823069
 * Vector 和HashTable 如何实现线程安全的？: https://juejin.cn/post/6844903503333179405
 */

import java.util.*;

public class java_0500_ArrayList {
    public static void main(String[] args) {

        // ArrayList-初始化方式
        System.out.println("--------------------ArrayList-初始化方式--------------------");

        // 方式一: ArrayList: 最常用的方式
        ArrayList<String> arrayList = new ArrayList<>();  // 后面的尖括号不用填, 后面的圆括号代表初始容量, 默认为 10

        // 方式二: 由数组直接生成 - 数组 转 List
        String[] strArr = new String[]{"a1", "a2", "a3"};
        List<String> list2 = new ArrayList<>(Arrays.asList(strArr));
        list2.add("xqz");
        list2.add("dance");

        // 方式三: 可以存储任意类型的 ArrayList
        ArrayList list3 = new ArrayList();
        // 等同于: ArrayList<Object> list3 = new ArrayList<Object>();
        list3.add("xqz");
        list3.add(18);

        // 遍历ArrayList
        System.out.println("--------------------遍历ArrayList--------------------");

        // 直接输出
        System.out.println("直接输出ArrayList: " + list2);             // [a1, a2, a3, xqz, dance]
        System.out.println("直接输出ArrayList: " + list2.toString());  // [a1, a2, a3, xqz, dance]

        // 遍历方式一
        System.out.println("遍历方式一:");
        for (int i=0; i<list2.size(); i++) {
            System.out.println(list2.get(i));
        }

        // 遍历方式二: 较为常用
        System.out.println("遍历方式二:");
        for (String str : list2) {
            System.out.println(str);
        }

        // 遍历方式三: 使用迭代器
        // 返回的是 ArrayList 的内部类 Itr。 Itr 实现了 Iterator 接口, Itr 包含了具体实现
        System.out.println("遍历方式三: 使用迭代器");
        Iterator<String> itor = list2.iterator();
        while (itor.hasNext()) {
            System.out.println(itor.next());
        }

        // List转数组
        System.out.println("--------------------List 转 数组--------------------");

        // 注意参数, 不传参数返回的就是 Object[]
        String[] arr = list2.toArray(new String[list2.size()]);
        System.out.println("转换后的数组: " + Arrays.toString(arr));

        // 数组 转 List
        System.out.println("--------------------数组 转 List--------------------");

        // 注意参数, 不传参数返回的就是 Object[]
        List<String> list4 = Arrays.asList(arr);

        // ArrayList常用方法
        System.out.println("--------------------ArrayList常用方法--------------------");

        System.out.println("查看jdk文档！");

        // 线程安全的Vector
        System.out.println("--------------------线程安全的Vector--------------------");

        Vector<String> vector = new Vector<>();

        vector.add("xqz");
        vector.add("xinge");

        System.out.println("Vector中的值: " + vector);

    }
}
